
/*
 * @Author: c
 * @Date: 2023-12-12 13:47:34
 * @LastEditTime: 2024-01-27 22:28:27
 * @LastEditors: c
 * @Description: 全局异常过滤器
 * @FilePath: \music-web-backend\src\common\filters\all-exceptions.filter.ts
 * https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
// Copyright 2023 Administrator
// 
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// 
//     http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

import { ArgumentsHost, BadRequestException, Catch, HttpException, HttpStatus, Logger } from '@nestjs/common';
import { Request, Response } from 'express';

import { BaseExceptionFilter } from '@nestjs/core';
import { BaseException } from '../exception/base.exception';

@Catch()//@Catch(UserNameNotFoundException,HttpException)
export class AllExceptionsFilter extends BaseExceptionFilter {


    catch(exception: unknown, host: ArgumentsHost) {
        // super.catch(exception, host);


        const ctx = host.switchToHttp();
        const response = ctx.getResponse<Response>();
        const request = ctx.getRequest<Request>();
        // const status = exception.getStatus();

        let status = null
        let msg = '未知错误'
        let code = '-1'

        if (exception instanceof BaseException) {
            status = exception.getStatus()
            msg = exception.getMsg();
            code = exception.getCode();
        } else if (exception instanceof BadRequestException) {
            const exce: BadRequestException = exception as BadRequestException
            const obj: any = exce.getResponse()


            status = exception.getStatus()

            msg = Array.isArray(obj.message) ? obj.message.join(',') : obj.message

            // code = obj.statusCode;
        } else if (exception instanceof HttpException) {

            status = exception.getStatus()
            msg = exception.message
        } else {

            // throw exception;
            Logger.error(exception)
            status = HttpStatus.INTERNAL_SERVER_ERROR
        }

        //TODO 添加产生异常的日志
        Logger.error(msg)

        response
            .status(status)
            .json({
                success: false,
                status: status,
                code: code,
                // statusCode: status ,
                msg: msg,
                timestamp: new Date().toISOString(),
                // path: request.url,
            });

    }
}
